package com.mwf.infrastructure.adapter.repository;

import com.mwf.domain.tag.adapter.repository.ITagRepository;
import com.mwf.domain.tag.model.entity.CrowdTagsJobEntity;
import com.mwf.infrastructure.dao.ICrowdTagsDao;
import com.mwf.infrastructure.dao.ICrowdTagsDetailDao;
import com.mwf.infrastructure.dao.ICrowdTagsJobDao;
import com.mwf.infrastructure.dao.po.CrowdTags;
import com.mwf.infrastructure.dao.po.CrowdTagsDetail;
import com.mwf.infrastructure.dao.po.CrowdTagsJob;
import com.mwf.infrastructure.redis.RedissonService;
import org.redisson.api.RBitSet;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;

@Repository
public class TagRepository implements ITagRepository {

    @Resource
    private ICrowdTagsJobDao crowdTagsJobDao;

    @Resource
    private ICrowdTagsDetailDao crowdTagsDetailDao;

    @Resource
    private ICrowdTagsDao crowdTagsDao;

    @Resource
    private RedissonService redissonService;


    @Override
    public CrowdTagsJobEntity queryCrowdTagsJobEntity(String tagId, String batchId) {
        CrowdTagsJob crowdTagsJob = new CrowdTagsJob();
        crowdTagsJob.setTagId(tagId);
        crowdTagsJob.setBatchId(batchId);
        CrowdTagsJob crowdTagsJobRes = crowdTagsJobDao.queryCrowdTagsJob(crowdTagsJob);

        CrowdTagsJobEntity crowdTagsJobEntity = CrowdTagsJobEntity.builder()
                .tagType(crowdTagsJobRes.getTagType())
                .tagRule(crowdTagsJobRes.getTagRule())
                .statStartTime(crowdTagsJobRes.getStatStartTime())
                .statEndTime(crowdTagsJobRes.getStatEndTime())
                .build();
        return crowdTagsJobEntity;
    }

    @Override
    public void addCrowdTagsUserId(String tagId, String item) {
        CrowdTagsDetail crowdTagsDetail = new CrowdTagsDetail();
        crowdTagsDetail.setTagId(tagId);
        crowdTagsDetail.setUserId(item);
        try {
            crowdTagsDetailDao.addCrowdTagsUserId(crowdTagsDetail);
            RBitSet bitSet = redissonService.getBitSet(tagId);
            bitSet.set(redissonService.getIndexFromUserId(item));
        }catch (DuplicateKeyException e){

        }
    }

    @Override
    public void updateCrowdTagsStatistics(String tagId, int size) {
        CrowdTags crowdTags = new CrowdTags();
        crowdTags.setTagId(tagId);
        crowdTags.setStatistics(size);
        crowdTagsDao.updateCrowdTagsStatistics(crowdTags);
    }
}
